'''
Created on 25/07/2011

@author: joaquin
'''

import commands;
import datetime;
import Logs;
from packagekit.client import PackageKitClient

class xLogica(object):
    '''
    Clase que contiene toda la logica de GEdora.
    '''
    
    #Variables
    __pk = PackageKitClient();
    __nucleos = [];
    __log = Logs.xLogs();

    #Constructor
    def __init__(self):
        '''
        Constructor
        '''
        
    def getNucleo(self, num):
        '''
        Devuelve el nombre del nucleo seleccionado
        '''
        return self.__nucleos[num];
    
    def removeNucleos(self, num):
        '''
        Elimina el nucleo deseado
        '''
        print("Eliminando el nucleo seleccionado, espere hasta finalizar todas las operaciones...");
        self.__pk.remove_packages(self.__nucleos[num]);
        self.__log.creaFichero("log-" + str(datetime.datetime.now()), "Se ha eliminado el nucleo: " + str(self.__nucleos[num]), "logs/");
        self.__nucleos.remove(self.__nucleos[num]);
        
    
    def obtenerKernel(self):
        """
        Obtiene los nucleos que hay en el sistema
        """
        
        # Tablas donde guardo los nucleos
        tablaPAE = [];
        tablaNormal = [];
        
        if self.__pk.resolve("kernel-PAE", "installed"):
            print(">>> Detectado kernel PAE (Phisical Address Extension).");
            tablaPAE = self.__pk.resolve("kernel-PAE", "installed");
            for pae in tablaPAE:
                print(pae);
        
        if self.__pk.resolve("kernel", "installed"):
            print(">>> Detectado kernel.");
            tablaNormal = self.__pk.resolve("kernel", "installed");
            for normal in tablaNormal:
                print(normal);
        
        # Obtengo la cantidad de nucleos total
        suma = len(tablaPAE) + len(tablaNormal);
        cont = 0;
        
        # Para poder eliminar algun nucleo, necesito dos o mas
        if suma==0 or suma==1:
            print("No existen nucleos suficientes para realizar la accion.");
        else:
            while cont < suma:
                for pae in tablaPAE:
                    self.__nucleos.append(pae);
                    cont = cont +1;
                
                for normal in tablaNormal:
                    self.__nucleos.append(normal);
                    cont = cont + 1;
        
            print("Hay un total de " + str(cont) + " nucleos instalados en el sistema.\n");
    
    def imprimirKernel(self):
        """
        Esta funcion imprime los kernels que hay en el sistema,
        antes de ejecutarla, hay que ejecutar eliminarKernelUso para quitar
        de la lista el nucleo que estamos usando actualmente, si no,
        lo imprimira tambien.
        """
        
        cont = 0;
        print("\n--- Kernels instalados en este sistema ---");
        for match in self.__nucleos:
            print ("[" + str(cont) + "] " + str(match));
            cont = cont+1;
        
        print("---------------------------------------------");
        print("Se ha encontrado un total de " + str(cont) + " nucleo que puede eliminar.");
        print("De esta lista se ha eliminado el nucleo actualmente en uso.");
    
    def numeroKernel(self):
        """
        Devuelve el numero de nucleos que hay en el sistema
        una vez que se ha rellenado la lista
        """
        
        # Obtengo la cantidad de elementos almacenados
        num = len(self.__nucleos);
        
        # No existe ningun nucleo
        if num==0:
            cont = 0;
        # Solo existe un nucleo
        elif num==1:
            cont = 1;
        # Existen varios nucleos
        else:
            cont = num;
        
        return cont;
    
    

    def eliminarEnUso(self):
        """
        Elimina el kernel en uso de la lista de nucleos
        """
        
        cont = 0;
        
        # Obtengo el nucleo actual
        nActual = commands.getoutput("uname -r");
        
        # Si el nucleo es PAE.
        if nActual[-3:] == "PAE":
            nucleo = "kernel-PAE-" + nActual[:-4];
        # En otro caso, sera un nucleo normal.
        else:
            nucleo = "kernel-" + nActual;
        
        for item in self.__nucleos:
            nombre = str(item);
            if nucleo == nombre:
                elemento = item;
                break;
            else:
                cont = cont + 1;
        
        self.__nucleos.remove(elemento);